const express = require("express");
const router = express.Router();

// 注意，需要是一个post请求
router.post("/ask",async (req, res)=>{
  // 拿到用户的问题
  const question = req.body.question || "";

  // 接下来需要将用户问题放入到提示词模板
  const prompt = `
    你是一个中文智能助手，请使用中文回答用户的问题。
    问题：${question}
  `;

  const response = await fetch("http://localhost:11434/api/generate",{
    method: "POST",
    headers: {"Content-Type": "application/json"},
    body: JSON.stringify({
      model: "llama3",
      prompt,
      stream: true
    })
  })

  // 首先需要设置一下响应头
  // 告诉客户端这是一个 Server-Sent-Events 流（SSE）
  res.setHeader("Content-Type", "text/event-stream");
  // 禁用缓存，确保每一次获取到的是最新的内容，防止浏览器缓存 SSE 内容
  res.setHeader("Cache-Control","no-cache");

  const reader = response.body.getReader(); // 拿到 Reader 对象
  const decoder = new TextDecoder("utf-8"); // 创建一个 utf-8 的解码器

  while(true){
    const { done, value } = await reader.read(); // 读取当前块的内容
    if(done) break;

    // 对二进制数据进行解码
    const chunk = decoder.decode(value, { stream: true });
    // chunk = '{"response":"你好"}\n{"response":"，"}\n'

    // 后面就是一些 JS 相关的基操了
    const lines = chunk.split("\n").filter((line)=>line.trim());
    // lines = [
    //   '{"response":"你好"}',
    //   '{"response":"，"}',
    //   '{"response":"我是"}',
    //   '{"response":"AI助手"}'
    // ]
    for(const line of lines){
      try{
        const data = JSON.parse(line); // data = {"response":"你好"}
        if(data.response){
          // 发送给客户端
          res.write(`${JSON.stringify({ response: data.response })}\n`);
        }
      }catch(e){
        console.error("JSON解析失败☹️", e.message);
      }
    }
  }
  // 代码来到这里，说明所有的块儿都处理完了
  res.end();
})

module.exports = router;
